package Gradle基础;

项目与任务

gradle构建由一个或多个项目组成。 Gradle中的所有内容都基于项目和任务。

Gradle Tasks
在Gradle中，任务(Tasks)是构建所执行的单个工作单元。这些任务可以是编译类(compiling classes)，creating a JAR，GeneratingJavadoc，以及
发布(publishing)到存储库中。对于构建过程，可以将其视为单个原子工作。

Gradle的优势在于他可扩展的模型。任务是此模型的核心。任务是Gradle运作的独立单元。一项任务的本质是行动。例如，我们可以声明一个任务来编译Java源代码或
将一些数据从一个目录复制到另一个目录。一个任务可以孤立地执行某些操作，但是我们也可以声明对其他任务的依赖。任务还可以定义其输入和从中读取和写入的文件的
输出。这使Gradle可以确定是否需要完成任务。

Gradle Projects

在Gradle中，项目是一个或多个任务的集合。项目代表library JAR或Web应用程序。它还可以服务于分发ZIP，该分发ZIP是由不同项目的JAR组装而成的。一个项目
可能会将我们的应用程序部署到暂存或生产环境中。每个Gradle构建都包含一个或多个项目。

Tasks 类型
Gradle中有两种任务。它们如下:

默认任务(Default task)
自定义任务(Custom task)

默认任务(Default Tasks)
默认任务是Gradle的预定义任务。我们可以在我们的项目中定义它。如果没有指定其他任务，Gradle让我们定义一个或多个默认任务。

我们可以通过运行gradle task命令列出默认任务。考虑以下输出:

摇篮项目 and Tasks
自定义任务(Custom tasks)
Gradle允许我们创建任务；这些任务称为自定义任务。自定义任务是用户定义的任务，旨在执行某些特定的工作。

语法:

Task task_name{
	group '-------group_name for task-------'
	description '-------description of the task-------'
	doLast{
	-------code for execution-------
-----------------------------------
-----------------------------------
}
}
请按照以下步骤创建自定义任务:

第1步  -  创建一个Gradle项目。要创建Gradle项目，请打开eclipse并导航到new-> other，然后选择Gradle项目。之后，请执行一些必要的步骤。

第2步  -  浏览项目并打开 build.gradle 文件。

摇篮项目 and Tasks
第3步  -  在 build.gradle 文件中添加任务代码。考虑下面的示例:

task Learnfk_task{
	group "Custom task"
	description "Learnfk Gradle Custom task Example."
	doLast{
		println "Welcome to Learnfk. It is a Custom task Example.";
	}
} 
第4步  -  打开命令行并将目录更改为Gradle项目的位置。此外，我们可以从Eclipse中执行此操作，右键单击项目并选择属性(Properties)。

摇篮项目 and Tasks
单击资源，然后单击位置。

摇篮项目 and Tasks
在地址栏中键入 cmd ，以打开此目录中的命令行

摇篮项目 and Tasks
第5步  -  要了解默认任务并在项目中定义任务，请键入 gradle tasks 命令。

摇篮项目 and Tasks
第6步   -  现在，要执行我们的自定义任务，请运行命令 gradle taskname (由于任务名称是Learnfk，因此请gradle javatpoint)。考虑以下输出:

摇篮项目 and Tasks
使用DSL特定语法定义任务
在新文件夹中，使用以下命令创建一个 build.gradle 文件(以Groovy DSL编写)，或一个 build.gradle.kts 文件(以Kotlin DSL编写)。以下代码:

tasks.register("hello") { 
    doLast { 
        println 'Hello, World!'
    }
}
上面的Groovy代码将注册一个名为hello的新必需任务，并将消息打印到控制台。

保存文件并运行以下命令:

gradle tasks --all. 
我们的新任务将出现在其他任务下。要验证是否已创建我们的任务，请运行以下命令:

gradle tasks --all
使用字符串为任务名称定义任务:
我们可以使用字符串作为任务名称来定义任务。例如，我们要定义一个任务名称'hello'，将以下代码放入build.gradle文件中:

build.gradle
task('hello') {
    doLast {
        println "hello"
    }
}
task('copy', type: Copy) {
    from(file('srcDir'))
    into(buildDir)
}
还有另一种定义任务的方法(我们也可以使用任务容器来定义任务)。

使用任务容器定义任务:
TaskContainer管理一组Task实例。我们可以通过调用 Project.getTasks()来访问TaskContainer实例，也可以在构建脚本中使用task属性。

使用TaskContainer定义任务的" hello world"示例如下:

build.gradle
tasks.create('hello') {
    doLast {
        println "hello"
    }
}
tasks.create('copy', Copy) {
    from(file('srcDir'))
    into(buildDir)
}
在这里，我们可以将任务添加到任务集合中。

自定义任务中的doFirst和doLast块
在Gradle中，doFirst和doLast是两个不同的自定义任务块。这些块在块部分中定义。在doFirst块中，我们确定要首先执行的任务，而doLast块最后用于运行该任务。考虑以
下代码片段:

task A{
	doFirst{
		println "Hello welcome to Learnfk"
	}
	doLast{
		println "Thank You Bye Bye."
	}
}
在Gradle中复制任务
Gradle允许我们将任务从一个目录复制到另一目录。以下语法用于复制任务:

task task_name(type: Copy){
	From "--------------------DirectoryPath----------------"
	Into " --------------------DirectoryPath----------------"
}
任务分组
在Gradle中，我们可以将任务分组。要对任务进行分组，我们将对所有任务使用相同的组名。要对名为javatpoint1和javatpoint2的两个任务进行分组，请将以下代码
写入build.gradle文件:

task javatpoint1{
	group "Learnfk_task"
	doLast{
		println "This is a task 1." 
	}
}
task javatpoint2{
	group "Learnfk_task"
	doLast{
		println "This is a task 2." 
	}
}
跳过任务
在Gradle中，有多种方法可以跳过任务的执行。要跳过任务，请在任务代码中附加 onlyIf()。考虑以下代码片段:

task javatpoint1{
	group "Learnfk_task1"
	doLast{
		println "This is a task." 
	}
}
javatpoint1.onlyIf{
	project.hasProperty('doOperation')
}
使用谓词跳过任务
在Gradle中， onlyif()方法可以附加谓词。在这种情况下，仅当谓词为true时才执行任务。谓词实现为闭包，并与参数一起传递。如果执行任务，则返回true，否则返回false。如果任务被跳过。谓词在任务之前被评估。考虑以下代码片段:

task test_Learnfk{
	group "Task1"
	doLast{
		println "This is a task." 
	}
}
test_Learnfk.onlyIf{
	!project.hasProperty('skipTest')
}
使用StopExecutionException跳过任务
在Gradle中，我们还可以使用 StopExecutionException 代替谓词来跳过任务。如果将此异常引发给任务，则将跳过该任务的操作，并且构建将继续执行下一个任务。
考虑以下代码片段:

task compile{
	doLast{
		println "Here we are compiling"
	}
}
compile.doFirst{
	if (true)
	{
		throw new StopExecutionException()
	}
}
task Learnfk (dependsOn: 'compile') {
	doLast{
		println 'i am not affected'
	}
}
启用和禁用任务
Gradle允许我们启用和禁用任务；默认情况下，它是启用的。要禁用任务，我们必须将其标记为SKIPPED。考虑以下代码片段:

task Learnfk_disableTask{
	doLast{
		println "this statement should not be printed if the task is disabled."
		}
}
Learnfk_disableTask.enabled = false
Gradle任务依赖
当一个任务依赖于另一个任务时，使用任务依赖关系。 dependsOn 关键字与任务名称一起使用以使任务依赖。

考虑下面的示例，它包含两个名为LearnfkOperation1和LearnfkOperation2的任务。第二个任务的第一个任务带有'depends'关键字，这意味着第二个任务仅在第一个
任务成功执行后才执行:

task javatpointOperation1{
	group "CustomTasks"
	doLast{
		println "This is operation 1 of Learnfk"
	}
}
task javatpointOperation2(dependsOn: 'javatpointOperation1'){
	group "CustomTasks"
	doLast{
		println "This is operation 2 of Learnfk"
	}
}
Gradle中任务的快捷方式表示法
我们可以创建现有任务的快捷方式，每个任务都被视为构建脚本的属性。为此，请在build.gradle文件中添加以下代码片段。

task Learnfk {
	doLast {
		println 'Hello world!'
	}
}
Learnfk.doLast {
	println "Greetings from the $Learnfk.name task."
}
任务中的自定义属性
在Gradle中，我们可以创建属性并将其添加到任务中。要添加属性，请将 ext.myProperty 设置为任务的初始值。考虑以下代码片段:

task LearnfkTask {
    ext.myProperty = "This is a custom property"
}
task printTask {
    doLast {
        println LearnfkTask.myProperty
    }
}

对于更高级的用法，您可以使用闭包来定义任务依赖。在计算依赖时，闭包会被传入正在计算依赖的任务。这个闭包应该返回一个 Task 对象或是 Task 对象的集合，返回值会被作为这个任务的依赖项。下面的示例是从 taskX 加入了项目中所有名称以 lib 开头的任务的依赖：

使用闭包添加依赖

build.gradle

task taskX << {
    println 'taskX'
}
taskX.dependsOn {
    tasks.findAll { task -> task.name.startsWith('lib') }
}
task lib1 << {
    println 'lib1'
}
task lib2 << {
    println 'lib2'
}
task notALib << {
    println 'notALib'
}  
gradle -q taskX 的输出结果

> gradle -q taskX
lib1
lib2
taskX  